# $Id: whois.py 7557b5d4d82b 2012/12/02 09:07:16 pgurumur $
# Copyright (c) 2009 Prabhu Gurumurthy  <pgurumur@gmail.com>
# 
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#

__version__ = "$Revision: 7557b5d4d82b $"
__author__ = "$Author: pgurumur $"

from djanet.lib import exception, ip, stdlib, tcp

def GetServers():
   return ['none', 'whois.arin.net', 'whois.ripe.net', 'whois.apnic.net',
         'whois.afrinic.net', 'whois.lacnic.net', 'whois.radb.net']

class Whois(tcp.tcp):
   def __init__(self, Host, Port = 43):
      super(stdlib.my_class(self), self).__init__(Host, Port)
      self._err = exception.WhoisError()
      self._connect = False
      self._ReadLength = 512
      self._ReadWait = 1

      if Host and Port:
         try:
            self.Connect()
         except tcp.SocketError, message:
            self._error(Message)
         else:
            self._connect = True

   def _error(self, Message):
      self.Close()
      if Message:
         raise exception.WhoisError, str(Message)

   def info(self, Query):
      retval = None
      if self._connect:
         try:
            sent = self.Write(Query)
            if sent:
               retval = self.Read(self._ReadLength, self._ReadWait)
         except tcp.SocketError, message:
            self._error(message)
         except AssertionError, message:
            self._error(message)

      return retval

